<?php
/**
 * 会员登录特性
 *
 * @date    2020-10-21 09:19:00
 * @version $Id$
 */

namespace App\Commons\Domain\Module\UserCenter\Traits;

use App\Commons\Domain\Module\UserCenter\Entity\UserEntity;
use App\Commons\Domain\Module\UserCenter\Model\Admin;

trait AdminLoginTrait
{
    private static string $ADMIN_CACHE_KEY = 'ADMIN_INFO:';
    private static int $CACHE_SECOND = 3600;

    /**
     * 移除登录缓存
     * @param  Admin $admin [description]
     * @return [type]         [description]
     */
    public function forgetAdminLoginInfo(Admin $admin)
    {
        $key = static::$ADMIN_CACHE_KEY.$admin->uid;

        return cache()->tags(['account'])->forget($key);
    }
     /**
     * 用户登录
     * @param  Admin $admin 会员模型
     * @param  string $ip     登录ip
     * @return [type]         [description]
     */
    public function adminLogin(Admin $admin, string $ip = null)
    {

        // 更新登录时间ip和次数
        app(UserEntity::class)->updateUserLogin($admin, $ip ?: '127.0.0.1');

        // 清楚上次登录缓存
        $this->forgetAdminLoginInfo($admin);

        return $admin;
    }

    /**
     * 用户信息
     * @param  Admin $admin 会员模型
     * @return [type]         [description]
     */
    public function adminInfo(Admin $admin)
    {
        $key_user = static::$ADMIN_CACHE_KEY.$admin->uid;

        // 缓存用户信息 一个小时，并标志为账户领域缓存
        // 执行cache()->tags(['account'])->flush() 将清除整个账户领域的缓存
        $info = cache()->tags(['account'])->remember(
            $key_user,
            static::$CACHE_SECOND,
            function () use ($admin) {
                // 从数据库查询用户最新数据进行缓存
                return $admin->query()->whereKey($admin->id)
                    ->select(['id', 'uid', 'username'])
                    ->first();
            }
        );

        // 保留权限信息
        $auth = ['admin' => true];

        return compact('info', 'auth');
    }
}
